import java.util.LinkedList;
import java.util.Queue;

/**
 * @author LKQ
 * @date 2021/12/5 22:17
 * @description 利用迭代的方法，引入一个队列，这是把递归程序改写成迭代程序的常用方法，初始化时我们把根节点入队两次。
 * 每次提取两个结点并比较它们的值（队列中每两个连续的结点应该是相等的，而且它们的子树互为镜像），然后将两个结点的左右子结点按相反的顺序插入队列中。
 * 当队列为空时，或者我们检测到树不对称（即从队列中取出两个不相等的连续结点）时，该算法结束。

 */
public class Solution1 {
    public static void main(String[] args) {
        TreeNode leaf4 = new TreeNode(4, null, null);
        TreeNode leaf3 = new TreeNode(3, null, null);
        TreeNode leaf2 = new TreeNode(2, leaf4, leaf3);
        TreeNode leaf1 = new TreeNode(2, leaf3, leaf4);
        TreeNode root = new TreeNode(1, leaf1, leaf2);
        Solution1 solution1 = new Solution1();
        solution1.isSymmetric(root);
    }
    public boolean isSymmetric(TreeNode root) {
        return check(root, root);
    }

    public boolean check(TreeNode u, TreeNode v) {
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(u);
        q.offer(v);
        while (!q.isEmpty()) {
            u = q.poll();
            v = q.poll();
            if (u == null && v == null) {
                continue;
            }
            if ((u == null || v == null) || (u.val != v.val)) {
                return false;
            }

            q.offer(u.left);
            q.offer(v.right);

            q.offer(u.right);
            q.offer(v.left);
        }
        return true;
    }

}
